package game.controller.animation{
	import flash.display.Sprite;
	import flash.events.Event;
	
	import game.data.constant.name.CoreName;
	import game.data.constant.name.NotificationName;
	
	import lib.gameEngine.common.data.Notification;
	import lib.gameEngine.core.Controller;
	
	/**
	 * 动画控制器类
	 * 
	 * 本类用来处理全部动画的帧事件，只此一家，别无分号。
	 * 
	 * 在监听到EnterFrame事件后，本类会发送名为EnterFrame的Notification
	 * 
	 * 届时，相应的View对象会接受，并进行相应处理。例如：
	 * 
	 * 调用舞台上角色的play函数，等等。
	 * 
	 * 同时，本类也会计算由于最小化等操作所造成的丢帧值，即计算丢帧时间。
	 * 
	 * 该数值会随同EnterFrame通知一同发送，由相应的显示对象自行处理
	 * 
	 *  
	 * @author Sunix
	 * 
	 */	
	public class AnimationCtr extends Controller{
		
		private var _lastTime:Number;   //上一次EnterFrame的时间
		private var _lossTime:Number;   //由于最小化等操作，所损耗的时间
		private var _frameRate:Number;  //帧率
		private var _sprite:Sprite;     //全局根舞台对象
		
		
		public function AnimationCtr(){	
			super(CoreName.ANIMATION);
			_sprite = getSprite();
		}
		
		override protected function registerNotify():void{  //注册通知
			this.addNotify(NotificationName.PLAY,onPlay);
			this.addNotify(NotificationName.STOP,onStop);
		}
		
		/**
		 * 当视图层的资源准备完毕后，会发送PLAY通知，然后本类就会启动帧监听，
		 * 
		 * 同时再发送ENTER_FRAME通知。
		 * 
		 * 视图层接收到ENTER_FRAME通知后，就会序列播放动画了。
		 * 
		 *  
		 * @param note
		 * 
		 */		
		private function onPlay(note:Notification):void{
			_sprite.addEventListener(Event.ENTER_FRAME,onEnterFrame);
		}
		
		/**
		 * 当视图层的动画停止后，会发送STOP通知，然后本类的监听就会停止，
		 * 
		 * 不再发送ENTER_FRAME通知
		 * 
		 *  
		 * @param note
		 * 
		 */		
		private function onStop(note:Notification):void{
			_sprite.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
		}
		
		private function onEnterFrame(e:Event):void{
			this.sendNotify(new Notification(NotificationName.ENTER_FRAME));
		}
	}
}